package com.wwj.my_ummary.util.numberUtils;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;

/**
 * <p> Title: BigDecUtils </p>
 * <p> Description: 大精度数据计算 </p>
 *
 * @author admin001
 * @date 2019年8月7日
 */
public class BigDecUtils {

    /**
     * 格式化输出结果
     */
    private static final DecimalFormat df = new DecimalFormat("0.00000000");

    private static final DecimalFormat dfStrip = new DecimalFormat("#0.########");

    private static final DecimalFormat format = new DecimalFormat("#.########");

    private static final int roundDown = BigDecimal.ROUND_DOWN; //截取

    private static final int halfUp = BigDecimal.ROUND_HALF_UP; //四舍五入


    /**
     * 保留小数点后n位
     *
     * @param a
     * @param n
     * @return
     */
    private static BigDecimal round(BigDecimal a, int n, int scale) {
        a = a.setScale(n, scale);
        return a;
    }

    /**
     * 截取保留8位小数
     *
     * @return
     */
    public static BigDecimal intercept(BigDecimal a) {
        return round(a, 8, roundDown);
    }

    /**
     * 四舍五入保留8位小数
     *
     * @param a
     * @return
     */
    public static BigDecimal rounding(BigDecimal a) {
        return round(a, 8, halfUp);
    }

    /**
     * a是否大于b
     *
     * @param a
     * @param b
     * @return
     */
    public static boolean GT(BigDecimal a, BigDecimal b) {
        if (a.compareTo(b) > 0) {
            return true;
        }
        return false;
    }

    /**
     * a是否大于等于b
     *
     * @param a
     * @param b
     * @return
     */
    public static boolean GTE(BigDecimal a, BigDecimal b) {
        if (a.compareTo(b) >= 0) {
            return true;
        }
        return false;
    }

    /**
     * 啊是否等于b
     *
     * @param a
     * @param b
     * @return
     */
    public static boolean EQ(BigDecimal a, BigDecimal b) {
        if (a.compareTo(b) == 0) {
            return true;
        }
        return false;
    }

    /**
     * a是否小于b
     *
     * @param a
     * @param b
     * @return
     */
    public static boolean LT(BigDecimal a, BigDecimal b) {
        if (a.compareTo(b) < 0) {
            return true;
        }
        return false;
    }

    /**
     * a是否小于等于b
     *
     * @param a
     * @param b
     * @return
     */
    public static boolean LTE(BigDecimal a, BigDecimal b) {
        if (a.compareTo(b) <= 0) {
            return true;
        }
        return false;
    }

    /**
     * 转换成0.00
     *
     * @param a
     * @return
     */
    public static String transString(BigDecimal a) {
        a = intercept(a);
        return String.valueOf(a);
    }


    /**
     * 精确的加法
     *
     * @param x double类型的数字
     * @param y double类型的数字
     * @return
     */
    public static String add(double x, double y) {
        BigDecimal b1 = new BigDecimal(Double.toString(x));
        BigDecimal b2 = new BigDecimal(Double.toString(y));
        return dfStrip.format(b1.add(b2));
    }

    /**
     * 精确的加法
     *
     * @param x String类型的数字
     * @param y String类型的数字
     * @return
     */
    public static String add(String x, String y) {
        BigDecimal b1 = new BigDecimal(x);
        BigDecimal b2 = new BigDecimal(y);
        return dfStrip.format(b1.add(b2));
    }

    /**
     * 精确的减法
     *
     * @param x double类型的数字
     * @param y double类型的数字
     * @return
     */
    public static String subtract(double x, double y) {
        BigDecimal b1 = new BigDecimal(Double.toString(x));
        BigDecimal b2 = new BigDecimal(Double.toString(y));
        return dfStrip.format(b1.subtract(b2));
    }

    /**
     * 精确的减法
     *
     * @param x String类型的数字
     * @param y String类型的数字
     * @return
     */
    public static String subtract(String x, String y) {
        BigDecimal b1 = new BigDecimal(x);
        BigDecimal b2 = new BigDecimal(y);
        return dfStrip.format(b1.subtract(b2));
    }

    /**
     * 精确的乘法
     *
     * @param x double类型的数字
     * @param y double类型的数字
     * @return
     */
    public static String multiply(double x, double y) {
        BigDecimal b1 = new BigDecimal(Double.toString(x));
        BigDecimal b2 = new BigDecimal(Double.toString(y));
        return dfStrip.format(b1.multiply(b2));
    }

    /**
     * 精确的乘法
     *
     * @param x String类型的数字
     * @param y String类型的数字
     * @return
     */
    public static String multiply(String x, String y) {
        BigDecimal b1 = new BigDecimal(x);
        BigDecimal b2 = new BigDecimal(y);
        return dfStrip.format(b1.multiply(b2));
    }

    /**
     * 精确的除法
     *
     * @param x String类型的数字
     * @param y String类型的数字
     * @return
     */
    public static String divide(double x, double y) {
        BigDecimal b1 = new BigDecimal(Double.toString(x));
        BigDecimal b2 = new BigDecimal(Double.toString(y));
        // scale指的是小数点后的位数,这里的2表示精确到小数点后面的两位小数
        // roundingMode是小数的保留模式。它们都是BigDecimal中的常量字段,有很多种。
        // 比如：BigDecimal.ROUND_HALF_UP表示的就是4舍5入
        return dfStrip.format(b1.divide(b2, 8, roundDown));
    }

    /**
     * 精确的除法
     *
     * @param x String类型的数字
     * @param y String类型的数字
     * @return
     */
    public static String divide(String x, String y) {
        BigDecimal b1 = new BigDecimal(x);
        BigDecimal b2 = new BigDecimal(y);
        return dfStrip.format(b1.divide(b2, 8, roundDown));
    }

    /**
     * 精确的除法-保留有效位中无用的0
     *
     * @param x String类型的数字
     * @param y String类型的数字
     * @return
     */
    public static String divideSave(String x, String y) {
        BigDecimal b1 = new BigDecimal(x);
        BigDecimal b2 = new BigDecimal(y);
        return df.format(b1.divide(b2, 8, roundDown));
    }

    /**
     * 数字处理去掉末尾的0
     *
     * @param s   String类型的数字
     * @param len 该数字之前是保留几位有效数字
     * @return
     */
    public static String zeroStrip(String s, int len) {
        if (s == null || s.length() < 1) {
            return "";
        }
        NumberFormat formater = null;
        double num = Double.parseDouble(s);
        if (len == 0) {
            formater = new DecimalFormat("###,###");
        } else {
            StringBuffer buff = new StringBuffer();
            buff.append("###,###.");
            for (int i = 0; i < len; i++) {
                buff.append("#");
            }
            formater = new DecimalFormat(buff.toString());
        }
        return formater.format(num);

        //BigDecimal自带的方法也可以处理去掉末尾的0
//		BigDecimal a=new BigDecimal("0.1000");
//		System.out.println(a.stripTrailingZeros().toPlainString());
    }

    /**
     * 去除小数后面多余的0，返回String
     *
     * @param a
     * @return
     */
    public static String reduceZeroToString(BigDecimal a) {
        return format.format(a.doubleValue());
    }

    public static void main(String[] args) {
        String string1 = "1";
        String string2 = "2";
//		System.out.println(insertComma(string1, 8));
//		BigDecimal a=new BigDecimal("0.1000");
//		System.out.println(a.stripTrailingZeros().toPlainString());
//		BigDecimal b1 = new BigDecimal(1);
//		BigDecimal b2 = new BigDecimal(3);
//		BigDecimal divide = b1.divide(b2, 8, roundDown);

//		BigDecimal stripTrailingZeros = divide.stripTrailingZeros();
//		String plainString = stripTrailingZeros.toPlainString();
//		String format = df.format(divide);
//		String zeroStrip = zeroStrip(format, 8);

//		System.out.println(divide);
//		System.out.println(stripTrailingZeros);
//		System.out.println(plainString);
//		System.out.println(format);
//		System.out.println(zeroStrip);
        System.out.println(divide(string1, string2));

    }

}
